package controller;

import java.io.IOException;
import java.sql.SQLException;
import java.util.GregorianCalendar;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Benutzer;
import model.Ebene;
import model.Feld;
import model.Gruppe;

@WebServlet({ "/Loeschen" })
public class Loeschen extends SessionControll {
	private static final long serialVersionUID = 1L;

	public Loeschen() {
		super();
	}
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		if(super.gruppePruefen(request, response, Gruppe.ADMIN)) {
			if("1".equals(request.getParameter("test"))) {
				try {
					Ebene ueberEbene = ebenenRepository.getNeusteEbeneNachId(Integer.parseInt(request.getParameter("parent")));
					if(ueberEbene == null) {
						request.setAttribute("ausgabe", "fehler");
					} else {
						if(ueberEbene.getId() == 1) {
							request.setAttribute("ausgabe", "");
						} else {
							Ebene[] ueberUeberEbenen = ueberEbene.ueberEbenenFindenAn(ebenenRepository.getNeusteEbeneNachId(1));
							if(ueberUeberEbenen == null) {
								request.setAttribute("ausgabe", "fehler");
							} else if (ueberUeberEbenen.length == 0) {
								request.setAttribute("ausgabe", "fehler");
							} else if(ueberUeberEbenen.length == 1) {
								request.setAttribute("ausgabe", "");
							} else {
								request.setAttribute("ausgabe", "Vorsicht, die Überebene dieser Ebene hängt an mehreren Stellen im Baum. (Sie ist per Hardlink verlinkt)\nMöchten sie diese Ebene wirklich an jeder Stelle im Baum löschen?");
							}
						}
					}
				} catch(NumberFormatException e) {
					request.setAttribute("ausgabe", "fehler");
					e.printStackTrace();
				} catch (ClassNotFoundException e) {
					request.setAttribute("ausgabe", "fehler");
					e.printStackTrace();
				} catch (SQLException e) {
					request.setAttribute("ausgabe", "fehler");
					e.printStackTrace();
				}
				RequestDispatcher view;
				view = request.getRequestDispatcher("Loeschen.jsp");
				view.forward(request, response);
			} else if("0".equals(request.getParameter("test"))) {
				try {
					int zuLoeschen = Integer.parseInt(request.getParameter("child"));
					Ebene ueberElement = ebenenRepository.getNeusteEbeneNachId(Integer.parseInt(request.getParameter("parent")));
					if(ueberElement != null) {
						Ebene[] uElemente = ueberElement.getUnterelement();
						if(uElemente != null) {
							Ebene[] uNeu = null;
							boolean aendern = false;
							if(uElemente.length != 0) {
								if(uElemente.length == 1) {
									if(uElemente[0].getId() == zuLoeschen) {
										uNeu = null;
										aendern = true;
									}
								} else {
									int pos = -1;
									for(int i=0; i<uElemente.length; i++) {
										if(uElemente[i].getId() == zuLoeschen) {
											pos = i;
											break;
										}
									}
									if(pos != -1) {
										aendern = true;
										uNeu = new Ebene[uElemente.length-1];
										for(int i=0; i<pos; i++) {
											uNeu[i] = uElemente[i];
										}
										for(int i=pos+1; i<uElemente.length; i++) {
											uNeu[i-1] = uElemente[i];
										}
									}
								}
								if(aendern) {
									Feld[] felder = ueberElement.getFeld();
									Feld f;
									long time = (new GregorianCalendar()).getTimeInMillis();
									// neue Versionen der Felder Erstellen
									if(felder != null) {
										for(int i=0; i<felder.length; i++) {
											f = new Feld(felder[i].getId(), felder[i].getTyp(), felder[i].getName(), felder[i].isDez2relevant(), time, felder[i].getWert());
											felderRepository.saveFeld(f);
										}
									}
									// neue Version der Ebene
									Ebene neu = new Ebene(ueberElement.getId(),
															ueberElement.getName(),
															ueberElement.getProsaId(),
															time,
															ueberElement.getRedaktionszustand(),
															benutzerArrayToString(ueberElement.getVerantwortlich()),
															benutzerArrayToString(ueberElement.getRedakteur()),
															ebeneArrayToString(uNeu),
															feldArrayToString(felder));
									ebenenRepository.saveEbene(neu);
								}
							}
						}
					}
				} catch(NumberFormatException e) {
					//TODO
					e.printStackTrace();
				} catch (ClassNotFoundException e) {
					//TODO
					e.printStackTrace();
				} catch (SQLException e) {
					//TODO
					e.printStackTrace();
				}
			}
		}
	}
	
	private String ebeneArrayToString(Ebene[] array) {
		String returnString = "";
		if (array != null) {
			for (int i = 0; i < array.length; i++) {
				returnString += array[i].getId() + ";";
			}
			if(returnString.endsWith(";")) {
				returnString = returnString.substring(0, (returnString.length()-1));
			}
		}
		return returnString;
	}
	
	private String feldArrayToString(Feld[] feld) {
		String feldReturn = "";
		if (feld != null) {
			for (int j = 0; j < feld.length; j++) {
				feldReturn += feld[j].getId() + ";";
			}
			if(feldReturn.endsWith(";")) {
				feldReturn.substring(0, (feldReturn.length()-1));
			}
		}
		return feldReturn;
	}
	
	private String benutzerArrayToString(Benutzer[] b) {
		String redakteurReturn = "";
		if (b != null) {
			for (int j = 0; j < b.length; j++) {
				redakteurReturn += b[j].getId() + ";";
			}
			if(redakteurReturn.endsWith(";")) {
				redakteurReturn.substring(0, (redakteurReturn.length()-1));
			}
		}
		return redakteurReturn;
	}
}
